// 员工基类（所有员工的共同属性和方法）
abstract class Employee {
    String name; // 姓名
    String id;   // 工号

    // 初始化员工信息
    public Employee(String name, String id) {
        this.name = name;
        this.id = id;
    }

    // 计算薪资的方法（让子类自己实现具体算法）
    public abstract double calculateSalary();

    // 生成工资条（固定格式）
    public String generateSalarySlip() {
        return "===工资条===\n" +
                "姓名：" + name + "\n" +
                "工号：" + id + "\n" +
                "本月工资：" + calculateSalary() + " 元\n" +
                "===========";
    }
}

// 普通员工类（按小时算工资）
class RegularEmployee extends Employee {
    double hourlyWage; // 时薪
    double workHours;  // 工作小时数

    // 初始化普通员工信息
    public RegularEmployee(String name, String id, double hourlyWage) {
        super(name, id); // 继承父类的姓名和工号
        this.hourlyWage = hourlyWage;
    }

    // 设置工作时长（带异常检查）
    public void setWorkHours(double hours) {
        if (hours < 0 || hours > 168) { // 一周最多168小时
            System.out.println("错误：工作时长必须在0-168小时之间！");
            return;
        }
        this.workHours = hours;
    }

    // 普通员工工资=时薪×工作小时数
    public double calculateSalary() {
        return hourlyWage * workHours;
    }
}

// 管理人员类（固定工资+奖金）
class Manager extends Employee {
    double baseSalary; // 基本工资
    double bonus;      // 奖金

    // 初始化管理人员信息
    public Manager(String name, String id, double baseSalary, double bonus) {
        super(name, id); // 继承父类的姓名和工号
        this.baseSalary = baseSalary;
        this.bonus = bonus;
    }

    // 管理人员工资=基本工资+奖金
    public double calculateSalary() {
        return baseSalary + bonus;
    }
}

// 存储工具类（模拟保存工资条）
class SalaryStorage {
    // 模拟将工资条"存储"起来（这里用打印表示存储成功）
    public static void saveSlip(String slip) {
        System.out.println("\n【存储成功】工资条已保存：");
        System.out.println(slip); // 实际开发中可能保存到文件或数据库
    }
}

// 主程序（测试所有功能）
public class SalarySystem {
    public static void main(String[] args) {
        // 1. 创建普通员工并生成工资条
        RegularEmployee zhangsan = new RegularEmployee("张三", "G001", 50);
        zhangsan.setWorkHours(160); // 正常工作时长
        String zhangsanSlip = zhangsan.generateSalarySlip();
        System.out.println("生成普通员工工资条：");
        System.out.println(zhangsanSlip);
        SalaryStorage.saveSlip(zhangsanSlip); // 存储工资条

        // 2. 创建管理人员并生成工资条
        Manager lisi = new Manager("李四", "M001", 10000, 5000);
        String lisiSlip = lisi.generateSalarySlip();
        System.out.println("\n生成管理人员工资条：");
        System.out.println(lisiSlip);
        SalaryStorage.saveSlip(lisiSlip); // 存储工资条

        // 3. 测试异常情况（工作时长不合理）
        System.out.println("\n测试异常情况：");
        RegularEmployee wangwu = new RegularEmployee("王五", "G002", 40);
        wangwu.setWorkHours(200); // 超过最大时长，触发异常提示
    }
}